library(data.table)
library(ggplot2)
library(ggthemes)
library(tidyr)
library(dplyr)
library(plotly)
library(DT)
setwd("/Users/greatyifan/Desktop/@Columbia/2020spring/2_DataViz/course_materials/Exercises/03_student_loans")
dt <- fread('data/survey_SCF.txt', header = T)
colnames(dt) <- tolower(colnames(dt))
options(scipen = 100)
diy_theme <- theme_economist_white(gray_bg = F, base_size = 10,
base_family = "georgia",horizontal = TRUE)+
theme(panel.grid.major = element_line(size = .3),
axis.line = element_line(colour = "black"))+
theme_tufte(base_size=14, ticks=F)
Task 1. Debt over time
dt_multiDebt <- dt[hdebt == 1, mean(debt, na.rm = T), by=year]
setnames(dt_multiDebt, 'V1', 'totalDebt')
dt_multiDebt$mort <- dt[hdebt == 1,mean(nh_mort, na.rm = T), by=year]$V1
dt_multiDebt$creditCard <- dt[hdebt == 1,mean(ccbal, na.rm = T), by=year]$V1
dt_multiDebt$install <- dt[hdebt == 1,mean(install, na.rm = T), by=year]$V1
dt_multiDebt$vehicle <- dt[hdebt == 1,mean(veh_inst, na.rm = T), by=year]$V1
dt_multiDebt$educ <- dt[hdebt == 1,mean(edn_inst, na.rm = T), by=year]$V1
dt_multiDebt[, year := year(as.Date(as.character(year), format = '%Y'))]
dt_compare <- gather(dt_multiDebt[,c('year', 'totalDebt', 'educ')], 'type', 'amount', -year)
dt_other <- gather(dt_multiDebt[,-c('totalDebt', 'educ')],
'type', 'amount', -c('year'))

dt_ratio <- dt[, mean(debt2inc), by = year]
## dt[year == 2016&income>0, mean(debt/income, na.rm = T)]
## this is how the debt2inc was calculated
setnames(dt_ratio, 'V1', 'debt2inc')
dt_ratio$leveratio <- dt[, mean(levratio), by = year]$V1
dt_ratio$eduratio <- dt[income>0, mean(edn_inst/income, na.rm = T), by = year]$V1
dt_ratio$mortratio <-dt[income>0, mean(nh_mort/income, na.rm = T), by = year]$V1
dt_ratio$creditCard <-dt[income>0, mean(ccbal/income, na.rm = T), by = year]$V1
dt_ratio$install <-dt[income>0, mean(install/income, na.rm = T), by = year]$V1
dt_ratio$vehicle <-dt[income>0, mean(veh_inst/income, na.rm = T), by = year]$V1
dt_compare2 <- gather(dt_ratio[,c('year','debt2inc', 'leveratio', 'eduratio')], key = 'type', value = 'value', - year)
dt_other2 <- gather(dt_ratio[,-c('debt2inc', 'leveratio', 'eduratio')], key = 'type', value = 'value', - year)
(allDebt2inc <- ggplot() +
geom_line(data = dt_compare2,
aes(x = year, y = value, color = type)) +
geom_line(data = dt_other2,
aes(x = year, y = value, color = type),
alpha = .8, linetype = 2, size = .3) +
labs(title = "Debt-Income Ratio Change Over Time \n",
caption = '\n Source: Survey of Consumer Finances (SCF)') +
diy_theme +
scale_color_manual(labels = c("credit card", "student loan", "installment",
"mortgage", "total debt", "vehicle loan"),
values = c('#66c2a4', '#00441b', '#f46d43',
'#41ae76', '#00441b', '#74c476', '#a1d99b')) +
theme(plot.subtitle = element_text(color = 'grey'),
axis.line = element_blank(),
axis.title = element_blank(),
plot.title = element_text(hjust = .5, size = 25),
legend.position = c(.5,1),
legend.title = element_blank(),
legend.direction = 'horizontal',
axis.title.y = element_blank(),
panel.grid.major.y=element_line(size = .1, color = 'grey')) +
scale_x_continuous("year",
labels = as.character(dt_multiDebt$year),
breaks = dt_multiDebt$year))

ggplot() +
geom_hline(yintercept = 1, color = '#6a51a3', linetype = 3, alpha = .5) +
geom_line(data = dt_compare2[dt_compare2$year >= 1998,],
aes(x = year, y = value, color = type)) +
geom_point(data = dt_compare2[dt_compare2$year >= 1998 & dt_compare2$type == 'eduratio',],
aes(x = year, y = value), color = '#f46d43') +
# xlim(c(1997,2017)) +
# coord_cartesian(ylim=c(0,2)) +
labs(title = "Debt-Income Ratio Change Over Time \n",
caption = '\n Source: Survey of Consumer Finances (SCF)') +
diy_theme +
scale_color_manual(labels = c("total debt to income", "student Loan to Income", "total debt to total assets"),
values = c('#41ae76', '#f46d43', '#41ae76')) +
theme(plot.title = element_text(hjust = .5, size = 25),
axis.line = element_blank(),
axis.title = element_blank(),
legend.position = c(.5,1),
legend.title = element_blank(),
legend.direction = 'horizontal',
axis.title.y = element_blank(),
panel.grid.major.y=element_line(size = .1, color = 'grey')) +
scale_x_continuous("year",
labels = as.character(dt_multiDebt$year),
breaks = dt_multiDebt$year)

In this task, I first use the first figure to compare the overall amount of debt with different types of debt, including student loan. This can help the reader get a big picture of household debt share and how they change over the past two decades. I used the orange line to show that the absolute amount of student loan is increasing, while the total amount of debt is fairly constant (indicating by the solid dark green line). In this way, we can stress the increasing importance of education.
The second figure give another aspect of the same problem, but here as we can see, the outliers in 1992 has ruined the whole picture, making the pattern in the rest of the years vague. Although this dramatic rise in the early 1990s is a great representation of the recession period, it is relatively irrelavate to our topic. Therefore, I would recommend to use the third figure shown above.
In the third graph, I cut out several years in last century, and only compare the pattern between student loan and the total debt. In general, the debet-to-income ratio of student loan is consistant with the total-debt-to-income ratio: they rose together. However, when we compare the 2016 student loan to income with previous data, we can see an increase, and this can be another way to show that it is getting popular for people to borrow money for their education.
Task 2. Tell me who you are
dt[, haveKids := ifelse(kids == 0, 0, 1)]
dt_gendered <- dt[year == 2016, mean(edn_inst), by = .(year, hhsex, haveKids, married)]
dt_gendered$hhsex <- factor(dt_gendered$hhsex)
levels(dt_gendered$hhsex) <- c('male', 'female')
dt_gendered$haveKids <- factor(dt_gendered$haveKids)
levels(dt_gendered$haveKids) <- c('no\nkids', 'have\nkid(s)')
dt_gendered$married <- factor(dt_gendered$married)
levels(dt_gendered$married) <- c('married', 'single')
ggplot(dt_gendered,
aes(x = as.factor(hhsex), y = V1, fill = as.factor(hhsex))) +
geom_bar(stat = 'identity',
width = .3, alpha = .85) +
diy_theme +
scale_fill_manual(values = c('#f46d43','#66bd63')) +
facet_grid(cols = vars(married), rows = vars(haveKids)) +
theme(axis.title = element_blank(),
legend.position = c(.5,1.05),
legend.title = element_blank(),
legend.direction = 'horizontal',
axis.text.x=element_text(size = 15),
panel.grid.minor.x=element_blank(),
panel.grid.major.x=element_blank(),
panel.grid.major.y=element_line(size = .3, color = 'grey'),
strip.text.y = element_text(size = 18, angle = 0, vjust = .5),
strip.text.x = element_text(size = 18),
plot.title = element_text(hjust = .5, size = 25)) +
labs(title = 'Gender and Family Status and the Amount of Student Loan\n',
caption = '\n Source: Survey of Consumer Finances (SCF)')

# single women 1, single mother 2, married women 3, married mother 4
dt[,women := ifelse(married == 2& haveKids == 0, 1,
ifelse(married == 2 & haveKids == 1, 2,
ifelse(married == 1 & haveKids == 0, 3, 4)))]
dt$women <- factor(dt$women)
levels(dt$women) <- c('single women', 'single mother', 'married women', 'married mother')
dt$agecl <- factor(dt$agecl)
levels(dt$agecl) <- c('less than\n 35 years old', '35-44', '45-54', '55-64', '65-74', 'more than\n 75 years old' )
women <- ggplot(dt[year == 2016 & hhsex == 2 & edn_inst > 1, ],
aes(x = agecl, y = edn_inst)) +
geom_jitter(aes(color = women), alpha = .4) +
geom_boxplot(alpha = 0, outlier.alpha = .1, color = '#4d4d4d') +
scale_y_log10() +
diy_theme +
scale_color_manual(values = c('#fee08b', '#99d594', '#d53e4f', '#3288bd')) +
theme(legend.title = element_blank(),
axis.title = element_blank(),
axis.ticks.x = element_line(size = .3, color = 'darkgrey'),
axis.ticks.length.x = unit(.05,'cm'),
axis.text.x=element_text(size = 15),
legend.position = c(.5,1),
legend.direction = 'horizontal',
panel.grid.major.y=element_line(size = .2, color = 'grey'),
plot.title = element_text(hjust = .5, size = 25)) +
labs(title = 'Different Types of Women and Their Student Loan\n',
caption = '\n Source: Survey of Consumer Finances (SCF)')
print(women)

In this section, I would focus this question to a more specific angle, and see the student loan pattern through the lens of gender, family and childrearing.
In the first graph, I showed the different pattern between male and female, single or married, having kids or not. It is surprising to see how single mother having such a burden.
Furthermore, when I keep on digging into the relationship between student loan and women’s marriage status and position in their life circle, we can see the difficulty young women (especially young single women) have been through.
If there is only one slot in the report available to put the graph in, I would recommend the first graph, as it gives a bigger picture, and involving both male and female. Besides, the sharp comparison can sure be “clickbaity”.
Task 3. Wealth and Income Distribution
dt_nwcat <- dt[year == 2016&edn_inst>0,]
dt_nwcat$nwcat <- as.factor(dt_nwcat$nwcat)
levels(dt_nwcat$nwcat) <- c('least \nwealthy','less \nwealthy','medium','wealthy','most \nwealthy')
ggplot(data = dt_nwcat,
aes(x = edn_inst/debt, fill = as.factor(nwcat))) +
geom_histogram(binwidth = .01) +
scale_y_continuous(expand = c(0, 0)) +
facet_grid(rows = vars(nwcat), scales = 'free_y', switch = 'both') +
diy_theme+
labs(title = "The Proportion of Student Loan in Total Debt and Family Net Worth",
caption = '\n Source: Survey of Consumer Finances (SCF)')+
theme(axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank(),
axis.ticks.x=element_blank(),
axis.title.x=element_blank(),
axis.text.x=element_text(size = 15),
strip.text.y=element_text(size = 18, angle = 180, vjust = 0),
legend.position = 'none',
plot.title = element_text(hjust = .5, size = 25))+
annotate("segment", x=-Inf, xend=Inf, y=-Inf, yend=-Inf) +
scale_fill_manual(values = c('#66bd63','#a6d96a','#fee08b','#fdae61','#f46d43'))+
scale_x_continuous(labels = c('0% of \n their loan is \n student loan','','half of \n their loan is \n student loan','','100% of \n their loan is \n student loan')) +
geom_vline(xintercept = c(0,.5,1), linetype = 3, alpha = .3)

In this section, I trt to depict the pattern between family capital and their educational debt. I strongly recommend this graph, as it just speaks for itself. We can see a distinct pattern in the stratified histogram. Less well-off families are more likely to devote all their money (at least borrowed money) into education, while affluent families tend not to do so.
Task 4. Going broke
dt[, thrifty := foodhome/(foodhome + fooddelv + foodaway)]
dt[, isThrifty := cut(dt$thrifty, 5)]
dt[, oops := ifelse(bnkruplast5 == 1 | forecllast5 == 1, 1, 0)]
dt_oops_year <- dt[year %in% 1998:2016&hdebt == 1, mean(edn_inst/debt),
by = .(year, oops)]
dt_oops_year$oops <- factor(dt_oops_year$oops)
levels(dt_oops_year$oops) <- c('no financial crisis', 'have financial crisis')
ggplot(dt_oops_year) +
geom_line(aes(x = year, y = V1, color = as.factor(oops),
group = as.factor(year), size = 3), alpha = .5, color = '#ffffbf') +
geom_point(aes(x = year, y = V1, color = as.factor(oops),
group = as.factor(year), size = 3)) +
diy_theme +
geom_line(data = dt_oops_year,
aes(x = year, y = V1, color = as.factor(oops)),
alpha = .5, size = .2,
linetype = 2) +
scale_color_manual(values = c('#f46d43','#66bd63')) +
labs(title = 'Proportion of Student Loan in Their Total Debt Amount and\nPersonal Financial Crisis\n',
caption = '\n Source: Survey of Consumer Finances (SCF)') +
scale_size(guide = F) +
theme(axis.title = element_blank(),
legend.position = c(.5,1),
legend.title = element_blank(),
legend.direction = 'horizontal',
panel.grid.minor.x=element_blank(),
panel.grid.major.x=element_blank(),
panel.grid.major.y=element_line(size = .3, color = 'grey'),
plot.title = element_text(hjust = .5, size = 25)) +
scale_x_continuous("year",
labels = as.character(dt_multiDebt$year),
breaks = dt_multiDebt$year)

dt$oops <- factor(dt$oops)
levels(dt$oops) <- c('no financial crisis', 'have financial crisis')
ggplot(dt[year == 2016&edn_inst>0],
aes(x = thrifty, y = edn_inst, color = as.factor(oops)))+
geom_jitter(alpha = .2, size = 3)+
scale_y_log10() +
labs(title = 'Amount of Student Loan and Personal Consumption Behavior in 2016\n',
caption = '\n Source: Survey of Consumer Finances (SCF)') +
diy_theme +
theme(axis.title = element_blank(),
legend.position = c(.5,1),
legend.title = element_blank(),
legend.direction = 'horizontal',
panel.grid.minor.x=element_blank(),
panel.grid.major.x=element_blank(),
panel.grid.major.y=element_line(size = .3, color = 'grey'),
plot.title = element_text(hjust = .5, size = 25)) +
scale_color_manual(values = c('#f46d43','#66bd63'))+
scale_x_continuous(labels =
c('least\nthrifty','','medium\nthrifty','','extremely\nthrifty')) +
geom_vline(xintercept = c(0,.5,1), linetype = 3, alpha = .3)

In this section, I compare those who messed up their own financial situation with those who do not in terms of their student loan. Over the years (data before 1998 is left out because of missing data), people who are in personal financial crisis tend to devote more into their (or their children’s) education. This can be a great aspect to tell a story.
The second graph shows how thrifty related to people’s student loan amount and their personal financial situation. It seems that people who lead a frugal life tend to have more and higher student loan. This sounds like a great story to talk about the social structure.
If I have to recommend, I would choose the first one, because of its over-time perspective and the strong comparison between these two types of people.
Task 5. Make two plots interactive
ggplotly(women, width = 900, height = 700)
The reason why I chose to make this one interactive is that it contains a large amount of information and points are crowned into some of these boxes. By clicking on and off these groups of women, reader can compare between two groups or see pattern of only one group of women.
ggplotly(allDebt2inc, width = 900, height = 700)
I choose to interactivate this graph because the whold time line is messed up by the “outlier” in 1992. Readers using this interactive map can help themselves to see more detailed patterns in other years, by zooming in and out.
Task 6. Data Table
dt_inter <- dt[year == 2016, c('year', 'women', 'thrifty', 'agecl', 'income', 'edn_inst')]
dt_inter[,thrifty:=round(thrifty,3)]
datatable(dt_inter, rownames = FALSE,
colnames = c('Year', 'Types of Women', 'Thrifty Degree', 'Age', 'Income', 'Student Loan'),
filter = list(position = "top"),
options = list(language = list(sSearch = "Filter:"))
)
I chose to make this table as an interactive one is because that one of the major reasons why people want to manipulate table themselves is that they want to see how people sharing the same features as them look like. Therefore, I gave this table so that women can choose over features and see their own position inside their counterparts.
LS0tCnRpdGxlOiAiQXNzaWdubWVudDFfQ2hlbmd3ZWlXYW5nIgpoZWFkZXItaW5jbHVkZXM6IAogIC0gXHVzZXBhY2thZ2V7c2V0c3BhY2V9XGRvdWJsZXNwYWNpbmcKZ3JhcGhpY3M6IHllcwpmb250c2l6ZTogMTJwdApnZW9tZXRyeTogbWFyZ2luPTFpbgppbmRlbnQ6IGZhbHNlCm1haW5mb250OiBHZW9yZ2lhCm91dHB1dDoKICBodG1sX25vdGVib29rCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQpvcHRzX2NodW5rJHNldChmaWcucGF0aD0iZmlndXJlcy8iLAogICAgICAgICAgICAgICBjYWNoZS5wYXRoPSJjYWNoZS8iLAogICAgICAgICAgICAgICBjYWNoZT1GQUxTRSwKICAgICAgICAgICAgICAgZWNobz1UUlVFLAogICAgICAgICAgICAgICBtZXNzYWdlPUZBTFNFLAogICAgICAgICAgICAgICB3YXJuaW5nPUZBTFNFLCAKICAgICAgICAgICAgICAgaW5jbHVkZSA9IFRSVUUsCiAgICAgICAgICAgICAgIGZpZy5yZXRpbmEgPSAyKSAgCmBgYAoKYGBge3IgcHJlcGFyYXRpb24sIHJlc3VsdHM9J2hpZGUnLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3RoZW1lcykKbGlicmFyeSh0aWR5cikKbGlicmFyeShkcGx5cikKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoRFQpCgpzZXR3ZCgiL1VzZXJzL2dyZWF0eWlmYW4vRGVza3RvcC9AQ29sdW1iaWEvMjAyMHNwcmluZy8yX0RhdGFWaXovY291cnNlX21hdGVyaWFscy9FeGVyY2lzZXMvMDNfc3R1ZGVudF9sb2FucyIpCgpkdCA8LSBmcmVhZCgnZGF0YS9zdXJ2ZXlfU0NGLnR4dCcsIGhlYWRlciA9IFQpCmNvbG5hbWVzKGR0KSA8LSB0b2xvd2VyKGNvbG5hbWVzKGR0KSkKCm9wdGlvbnMoc2NpcGVuID0gMTAwKQpgYGAKCmBgYHtyIHNldF90aGVtZSwgaW5jbHVkZT1UUlVFfQpkaXlfdGhlbWUgPC0gdGhlbWVfZWNvbm9taXN0X3doaXRlKGdyYXlfYmcgPSBGLCBiYXNlX3NpemUgPSAxMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9mYW1pbHkgPSAiZ2VvcmdpYSIsaG9yaXpvbnRhbCA9IFRSVUUpKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IC4zKSwKICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpKwogIHRoZW1lX3R1ZnRlKGJhc2Vfc2l6ZT0xNCwgdGlja3M9RikgCmBgYAoKCiMjIFRhc2sgMS4gRGVidCBvdmVyIHRpbWUKCgpgYGB7ciBxMV9kYXRhLCBpbmNsdWRlPVRSVUV9CmR0X211bHRpRGVidCA8LSBkdFtoZGVidCA9PSAxLCBtZWFuKGRlYnQsIG5hLnJtID0gVCksIGJ5PXllYXJdCnNldG5hbWVzKGR0X211bHRpRGVidCwgJ1YxJywgJ3RvdGFsRGVidCcpCmR0X211bHRpRGVidCRtb3J0IDwtIGR0W2hkZWJ0ID09IDEsbWVhbihuaF9tb3J0LCBuYS5ybSA9IFQpLCBieT15ZWFyXSRWMQpkdF9tdWx0aURlYnQkY3JlZGl0Q2FyZCA8LSBkdFtoZGVidCA9PSAxLG1lYW4oY2NiYWwsIG5hLnJtID0gVCksIGJ5PXllYXJdJFYxCmR0X211bHRpRGVidCRpbnN0YWxsIDwtIGR0W2hkZWJ0ID09IDEsbWVhbihpbnN0YWxsLCBuYS5ybSA9IFQpLCBieT15ZWFyXSRWMQpkdF9tdWx0aURlYnQkdmVoaWNsZSA8LSBkdFtoZGVidCA9PSAxLG1lYW4odmVoX2luc3QsIG5hLnJtID0gVCksIGJ5PXllYXJdJFYxCmR0X211bHRpRGVidCRlZHVjIDwtIGR0W2hkZWJ0ID09IDEsbWVhbihlZG5faW5zdCwgbmEucm0gPSBUKSwgYnk9eWVhcl0kVjEKZHRfbXVsdGlEZWJ0WywgeWVhciA6PSB5ZWFyKGFzLkRhdGUoYXMuY2hhcmFjdGVyKHllYXIpLCBmb3JtYXQgPSAnJVknKSldCgpkdF9jb21wYXJlIDwtIGdhdGhlcihkdF9tdWx0aURlYnRbLGMoJ3llYXInLCAndG90YWxEZWJ0JywgJ2VkdWMnKV0sICd0eXBlJywgJ2Ftb3VudCcsIC15ZWFyKQpkdF9vdGhlciA8LSBnYXRoZXIoZHRfbXVsdGlEZWJ0WywtYygndG90YWxEZWJ0JywgJ2VkdWMnKV0sIAogICAgICAgICAgICAgICAgICAgJ3R5cGUnLCAnYW1vdW50JywgLWMoJ3llYXInKSkKYGBgCgoKYGBge3IgcTFfZ3JhcGgxLCBpbmNsdWRlPVRSVUUsIGZpZy5yZXRpbmE9MiwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9Nn0KZ2dwbG90KCkgKwogIGdlb21fbGluZShkYXRhID0gZHRfY29tcGFyZSwgYWVzKHggPSB5ZWFyLCB5ID0gYW1vdW50LCBjb2xvciA9IGFzLmZhY3Rvcih0eXBlKSkpICsKICBnZW9tX3BvaW50KGRhdGEgPSBkdF9jb21wYXJlLCBhZXMoeCA9IHllYXIsIHkgPSBhbW91bnQsIGNvbG9yID0gYXMuZmFjdG9yKHR5cGUpKSwgCiAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IFRSVUUpICsKICBnZW9tX2xpbmUoZGF0YSA9IGR0X290aGVyLCAKICAgICAgICAgICAgYWVzKHggPSB5ZWFyLCB5ID0gYW1vdW50LCBjb2xvciA9IGFzLmZhY3Rvcih0eXBlKSksCiAgICAgICAgICAgIGFscGhhID0gLjYsIGxpbmV0eXBlID0gMikgKwogIHNjYWxlX3lfbG9nMTAoKSArCiAgZGl5X3RoZW1lICsKICBsYWJzKHRpdGxlID0gIkRpZmZlcmVudCBUeXBlcyBvZiBEZWJ0cycgQ2hhbmdlIE92ZXIgVGltZSBcbiIsIAogICAgICAgICAgc3VidGl0bGUgPSAnZGVidCBhbW91bnQnLAogICAgICAgICAgY2FwdGlvbiA9ICdcbiBTb3VyY2U6IFN1cnZleSBvZiBDb25zdW1lciBGaW5hbmNlcyAoU0NGKScpICsKICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gJ2dyZXknKSwKICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUsIHNpemUgPSAyNSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguNSwxLjA1KSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAnaG9yaXpvbnRhbCcsCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueT1lbGVtZW50X2xpbmUoc2l6ZSA9IC4xLCBjb2xvciA9ICdncmV5JykpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoInllYXIiLCAKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYXMuY2hhcmFjdGVyKGR0X211bHRpRGVidCR5ZWFyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gZHRfbXVsdGlEZWJ0JHllYXIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiY3JlZGl0IGNhcmQiLCAic3R1ZGVudCBsb2FuIiwgImluc3RhbGxtZW50IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vcnRnYWdlIiwgInRvdGFsIGRlYnQiLCAidmVoaWNsZSBsb2FuIiksIAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCcjNjZjMmE0JywgJyNmNDZkNDMnLCAnIzQxYWU3NicsICcjNzRjNDc2JywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyMwMDQ0MWInLCAnI2ExZDk5YicpKSAKCmBgYAoKCmBgYHtyIHExX2dyYXBoMiwgaW5jbHVkZT1UUlVFLCBmaWcucmV0aW5hPTIsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTZ9CmR0X3JhdGlvIDwtIGR0WywgbWVhbihkZWJ0MmluYyksIGJ5ID0geWVhcl0KIyMgZHRbeWVhciA9PSAyMDE2JmluY29tZT4wLCBtZWFuKGRlYnQvaW5jb21lLCBuYS5ybSA9IFQpXSAKIyMgdGhpcyBpcyBob3cgdGhlIGRlYnQyaW5jIHdhcyBjYWxjdWxhdGVkCnNldG5hbWVzKGR0X3JhdGlvLCAnVjEnLCAnZGVidDJpbmMnKQpkdF9yYXRpbyRsZXZlcmF0aW8gPC0gZHRbLCBtZWFuKGxldnJhdGlvKSwgYnkgPSB5ZWFyXSRWMQpkdF9yYXRpbyRlZHVyYXRpbyA8LSBkdFtpbmNvbWU+MCwgbWVhbihlZG5faW5zdC9pbmNvbWUsIG5hLnJtID0gVCksIGJ5ID0geWVhcl0kVjEKZHRfcmF0aW8kbW9ydHJhdGlvIDwtZHRbaW5jb21lPjAsIG1lYW4obmhfbW9ydC9pbmNvbWUsIG5hLnJtID0gVCksIGJ5ID0geWVhcl0kVjEKZHRfcmF0aW8kY3JlZGl0Q2FyZCA8LWR0W2luY29tZT4wLCBtZWFuKGNjYmFsL2luY29tZSwgbmEucm0gPSBUKSwgYnkgPSB5ZWFyXSRWMQpkdF9yYXRpbyRpbnN0YWxsIDwtZHRbaW5jb21lPjAsIG1lYW4oaW5zdGFsbC9pbmNvbWUsIG5hLnJtID0gVCksIGJ5ID0geWVhcl0kVjEKZHRfcmF0aW8kdmVoaWNsZSA8LWR0W2luY29tZT4wLCBtZWFuKHZlaF9pbnN0L2luY29tZSwgbmEucm0gPSBUKSwgYnkgPSB5ZWFyXSRWMQoKZHRfY29tcGFyZTIgPC0gZ2F0aGVyKGR0X3JhdGlvWyxjKCd5ZWFyJywnZGVidDJpbmMnLCAnbGV2ZXJhdGlvJywgJ2VkdXJhdGlvJyldLCBrZXkgPSAndHlwZScsIHZhbHVlID0gJ3ZhbHVlJywgLSB5ZWFyKQpkdF9vdGhlcjIgPC0gZ2F0aGVyKGR0X3JhdGlvWywtYygnZGVidDJpbmMnLCAnbGV2ZXJhdGlvJywgJ2VkdXJhdGlvJyldLCBrZXkgPSAndHlwZScsIHZhbHVlID0gJ3ZhbHVlJywgLSB5ZWFyKQoKKGFsbERlYnQyaW5jIDwtIGdncGxvdCgpICsKICBnZW9tX2xpbmUoZGF0YSA9IGR0X2NvbXBhcmUyLCAKICAgICAgIGFlcyh4ID0geWVhciwgeSA9IHZhbHVlLCBjb2xvciA9IHR5cGUpKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBkdF9vdGhlcjIsIAogICAgICAgYWVzKHggPSB5ZWFyLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSksIAogICAgICAgYWxwaGEgPSAuOCwgbGluZXR5cGUgPSAyLCBzaXplID0gLjMpICsKICBsYWJzKHRpdGxlID0gIkRlYnQtSW5jb21lIFJhdGlvIENoYW5nZSBPdmVyIFRpbWUgXG4iLCAKICAgICAgICAgIGNhcHRpb24gPSAnXG4gU291cmNlOiBTdXJ2ZXkgb2YgQ29uc3VtZXIgRmluYW5jZXMgKFNDRiknKSArCiAgZGl5X3RoZW1lICsKICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiY3JlZGl0IGNhcmQiLCAic3R1ZGVudCBsb2FuIiwgImluc3RhbGxtZW50IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vcnRnYWdlIiwgInRvdGFsIGRlYnQiLCAidmVoaWNsZSBsb2FuIiksIAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCcjNjZjMmE0JywgJyMwMDQ0MWInLCAnI2Y0NmQ0MycsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjNDFhZTc2JywgJyMwMDQ0MWInLCAnIzc0YzQ3NicsICcjYTFkOTliJykpICsKIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAnZ3JleScpLAogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSwgc2l6ZSA9IDI1KSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC41LDEpLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICdob3Jpem9udGFsJywKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55PWVsZW1lbnRfbGluZShzaXplID0gLjEsIGNvbG9yID0gJ2dyZXknKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKCJ5ZWFyIiwgCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGFzLmNoYXJhY3RlcihkdF9tdWx0aURlYnQkeWVhciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGR0X211bHRpRGVidCR5ZWFyKSkgCgpgYGAKCmBgYHtyIHExX2dyYXBoMywgaW5jbHVkZT1UUlVFLCBmaWcucmV0aW5hPTIsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTZ9CmdncGxvdCgpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxLCBjb2xvciA9ICcjNmE1MWEzJywgbGluZXR5cGUgPSAzLCBhbHBoYSA9IC41KSArCiAgZ2VvbV9saW5lKGRhdGEgPSBkdF9jb21wYXJlMltkdF9jb21wYXJlMiR5ZWFyID49IDE5OTgsXSwgCiAgICAgICBhZXMoeCA9IHllYXIsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGR0X2NvbXBhcmUyW2R0X2NvbXBhcmUyJHllYXIgPj0gMTk5OCAmIGR0X2NvbXBhcmUyJHR5cGUgPT0gJ2VkdXJhdGlvJyxdLAogICAgICAgICAgICAgYWVzKHggPSB5ZWFyLCB5ID0gdmFsdWUpLCBjb2xvciA9ICcjZjQ2ZDQzJykgKwogICMgeGxpbShjKDE5OTcsMjAxNykpICsKICAjIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwyKSkgKwogIGxhYnModGl0bGUgPSAiRGVidC1JbmNvbWUgUmF0aW8gQ2hhbmdlIE92ZXIgVGltZSBcbiIsIAogICAgICAgICAgY2FwdGlvbiA9ICdcbiBTb3VyY2U6IFN1cnZleSBvZiBDb25zdW1lciBGaW5hbmNlcyAoU0NGKScpICsKICBkaXlfdGhlbWUgKwogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKCJ0b3RhbCBkZWJ0IHRvIGluY29tZSIsICJzdHVkZW50IExvYW4gdG8gSW5jb21lIiwgInRvdGFsIGRlYnQgdG8gdG90YWwgYXNzZXRzIiksCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJyM0MWFlNzYnLCAnI2Y0NmQ0MycsICcjNDFhZTc2JykpICsKIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSwgc2l6ZSA9IDI1KSwKICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC41LDEpLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICdob3Jpem9udGFsJywKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55PWVsZW1lbnRfbGluZShzaXplID0gLjEsIGNvbG9yID0gJ2dyZXknKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKCJ5ZWFyIiwgCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGFzLmNoYXJhY3RlcihkdF9tdWx0aURlYnQkeWVhciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGR0X211bHRpRGVidCR5ZWFyKQoKYGBgCgoKPHAgc3R5bGU9ImZvbnQtZmFtaWx5OiBnZW9yZ2lhOyBmb250LXNpemU6MTFwdDsgZm9udC1zdHlsZTpyZWd1bGFyIj4KICAgIEluIHRoaXMgdGFzaywgSSBmaXJzdCB1c2UgdGhlIGZpcnN0IGZpZ3VyZSB0byBjb21wYXJlIHRoZSBvdmVyYWxsIGFtb3VudCBvZiBkZWJ0IHdpdGggZGlmZmVyZW50IHR5cGVzIG9mIGRlYnQsIGluY2x1ZGluZyBzdHVkZW50IGxvYW4uIFRoaXMgY2FuIGhlbHAgdGhlIHJlYWRlciBnZXQgYSBiaWcgcGljdHVyZSBvZiBob3VzZWhvbGQgZGVidCBzaGFyZSBhbmQgaG93IHRoZXkgY2hhbmdlIG92ZXIgdGhlIHBhc3QgdHdvIGRlY2FkZXMuIEkgdXNlZCB0aGUgb3JhbmdlIGxpbmUgdG8gc2hvdyB0aGF0IHRoZSBhYnNvbHV0ZSBhbW91bnQgb2Ygc3R1ZGVudCBsb2FuIGlzIGluY3JlYXNpbmcsIHdoaWxlIHRoZSB0b3RhbCBhbW91bnQgb2YgZGVidCBpcyBmYWlybHkgY29uc3RhbnQgKGluZGljYXRpbmcgYnkgdGhlIHNvbGlkIGRhcmsgZ3JlZW4gbGluZSkuIEluIHRoaXMgd2F5LCB3ZSBjYW4gc3RyZXNzIHRoZSBpbmNyZWFzaW5nIGltcG9ydGFuY2Ugb2YgZWR1Y2F0aW9uLjwvcD4gICAgCgo8cCBzdHlsZT0iZm9udC1mYW1pbHk6IGdlb3JnaWE7IGZvbnQtc2l6ZToxMXB0OyBmb250LXN0eWxlOnJlZ3VsYXIiPgogICAgVGhlIHNlY29uZCBmaWd1cmUgZ2l2ZSBhbm90aGVyIGFzcGVjdCBvZiB0aGUgc2FtZSBwcm9ibGVtLCBidXQgaGVyZSBhcyB3ZSBjYW4gc2VlLCB0aGUgb3V0bGllcnMgaW4gMTk5MiBoYXMgcnVpbmVkIHRoZSB3aG9sZSBwaWN0dXJlLCBtYWtpbmcgdGhlIHBhdHRlcm4gaW4gdGhlIHJlc3Qgb2YgdGhlIHllYXJzIHZhZ3VlLiBBbHRob3VnaCB0aGlzIGRyYW1hdGljIHJpc2UgaW4gdGhlIGVhcmx5IDE5OTBzIGlzIGEgZ3JlYXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY2Vzc2lvbiBwZXJpb2QsIGl0IGlzIHJlbGF0aXZlbHkgaXJyZWxhdmF0ZSB0byBvdXIgdG9waWMuIFRoZXJlZm9yZSwgSSB3b3VsZCByZWNvbW1lbmQgdG8gdXNlIHRoZSB0aGlyZCBmaWd1cmUgc2hvd24gYWJvdmUuIDwvcD4gCiAgICAKPHAgc3R5bGU9ImZvbnQtZmFtaWx5OiBnZW9yZ2lhOyBmb250LXNpemU6MTFwdDsgZm9udC1zdHlsZTpyZWd1bGFyIj4gICAgCiAgICBJbiB0aGUgdGhpcmQgZ3JhcGgsIEkgY3V0IG91dCBzZXZlcmFsIHllYXJzIGluIGxhc3QgY2VudHVyeSwgYW5kIG9ubHkgY29tcGFyZSB0aGUgcGF0dGVybiBiZXR3ZWVuIHN0dWRlbnQgbG9hbiBhbmQgdGhlIHRvdGFsIGRlYnQuIEluIGdlbmVyYWwsIHRoZSBkZWJldC10by1pbmNvbWUgcmF0aW8gb2Ygc3R1ZGVudCBsb2FuIGlzIGNvbnNpc3RhbnQgd2l0aCB0aGUgdG90YWwtZGVidC10by1pbmNvbWUgcmF0aW86IHRoZXkgcm9zZSB0b2dldGhlci4gSG93ZXZlciwgd2hlbiB3ZSBjb21wYXJlIHRoZSAyMDE2IHN0dWRlbnQgbG9hbiB0byBpbmNvbWUgd2l0aCBwcmV2aW91cyBkYXRhLCB3ZSBjYW4gc2VlIGFuIGluY3JlYXNlLCBhbmQgdGhpcyBjYW4gYmUgYW5vdGhlciB3YXkgdG8gc2hvdyB0aGF0IGl0IGlzIGdldHRpbmcgcG9wdWxhciBmb3IgcGVvcGxlIHRvIGJvcnJvdyBtb25leSBmb3IgdGhlaXIgZWR1Y2F0aW9uLjwvcD4gIAoKCiMjIFRhc2sgMi4gVGVsbCBtZSB3aG8geW91IGFyZQoKYGBge3IgcTJfZ3JhcGgxLCBpbmNsdWRlPVRSVUUsIGZpZy5yZXRpbmE9MiwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9Nn0KZHRbLCBoYXZlS2lkcyA6PSBpZmVsc2Uoa2lkcyA9PSAwLCAwLCAxKV0KZHRfZ2VuZGVyZWQgPC0gZHRbeWVhciA9PSAyMDE2LCBtZWFuKGVkbl9pbnN0KSwgYnkgPSAuKHllYXIsIGhoc2V4LCBoYXZlS2lkcywgbWFycmllZCldCmR0X2dlbmRlcmVkJGhoc2V4IDwtIGZhY3RvcihkdF9nZW5kZXJlZCRoaHNleCkKbGV2ZWxzKGR0X2dlbmRlcmVkJGhoc2V4KSA8LSBjKCdtYWxlJywgJ2ZlbWFsZScpCmR0X2dlbmRlcmVkJGhhdmVLaWRzIDwtIGZhY3RvcihkdF9nZW5kZXJlZCRoYXZlS2lkcykKbGV2ZWxzKGR0X2dlbmRlcmVkJGhhdmVLaWRzKSA8LSBjKCdub1xua2lkcycsICdoYXZlXG5raWQocyknKQpkdF9nZW5kZXJlZCRtYXJyaWVkIDwtIGZhY3RvcihkdF9nZW5kZXJlZCRtYXJyaWVkKQpsZXZlbHMoZHRfZ2VuZGVyZWQkbWFycmllZCkgPC0gYygnbWFycmllZCcsICdzaW5nbGUnKQoKZ2dwbG90KGR0X2dlbmRlcmVkLAogICAgICAgYWVzKHggPSBhcy5mYWN0b3IoaGhzZXgpLCB5ID0gVjEsIGZpbGwgPSBhcy5mYWN0b3IoaGhzZXgpKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLCAKICAgICAgICAgICB3aWR0aCA9IC4zLCBhbHBoYSA9IC44NSkgKwogIGRpeV90aGVtZSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygnI2Y0NmQ0MycsJyM2NmJkNjMnKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMobWFycmllZCksIHJvd3MgPSB2YXJzKGhhdmVLaWRzKSkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguNSwxLjA1KSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAnaG9yaXpvbnRhbCcsCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueT1lbGVtZW50X2xpbmUoc2l6ZSA9IC4zLCBjb2xvciA9ICdncmV5JyksCiAgICAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgYW5nbGUgPSAwLCB2anVzdCA9IC41KSwKICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUsIHNpemUgPSAyNSkpICsKICBsYWJzKHRpdGxlID0gJ0dlbmRlciBhbmQgRmFtaWx5IFN0YXR1cyBhbmQgdGhlIEFtb3VudCBvZiBTdHVkZW50IExvYW5cbicsCiAgICAgICBjYXB0aW9uID0gJ1xuIFNvdXJjZTogU3VydmV5IG9mIENvbnN1bWVyIEZpbmFuY2VzIChTQ0YpJykKCmBgYAoKCmBgYHtyIHEyX2dyYXBoMiwgaW5jbHVkZT1UUlVFLCBmaWcucmV0aW5hPTIsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTZ9CiMgc2luZ2xlIHdvbWVuIDEsIHNpbmdsZSBtb3RoZXIgMiwgbWFycmllZCB3b21lbiAzLCBtYXJyaWVkIG1vdGhlciA0CmR0Wyx3b21lbiA6PSBpZmVsc2UobWFycmllZCA9PSAyJiBoYXZlS2lkcyA9PSAwLCAxLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZShtYXJyaWVkID09IDIgJiBoYXZlS2lkcyA9PSAxLCAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobWFycmllZCA9PSAxICYgaGF2ZUtpZHMgPT0gMCwgMywgNCkpKV0KZHQkd29tZW4gPC0gZmFjdG9yKGR0JHdvbWVuKQpsZXZlbHMoZHQkd29tZW4pIDwtIGMoJ3NpbmdsZSB3b21lbicsICdzaW5nbGUgbW90aGVyJywgJ21hcnJpZWQgd29tZW4nLCAnbWFycmllZCBtb3RoZXInKQpkdCRhZ2VjbCA8LSBmYWN0b3IoZHQkYWdlY2wpCmxldmVscyhkdCRhZ2VjbCkgPC0gYygnbGVzcyB0aGFuXG4gMzUgeWVhcnMgb2xkJywgJzM1LTQ0JywgJzQ1LTU0JywgJzU1LTY0JywgJzY1LTc0JywgJ21vcmUgdGhhblxuIDc1IHllYXJzIG9sZCcgKQoKd29tZW4gPC0gZ2dwbG90KGR0W3llYXIgPT0gMjAxNiAmIGhoc2V4ID09IDIgJiBlZG5faW5zdCA+IDEsIF0sCiAgICAgICBhZXMoeCA9IGFnZWNsLCB5ID0gZWRuX2luc3QpKSArCiAgZ2VvbV9qaXR0ZXIoYWVzKGNvbG9yID0gd29tZW4pLCBhbHBoYSA9IC40KSArCiAgZ2VvbV9ib3hwbG90KGFscGhhID0gMCwgb3V0bGllci5hbHBoYSA9IC4xLCBjb2xvciA9ICcjNGQ0ZDRkJykgKwogIHNjYWxlX3lfbG9nMTAoKSArCiAgZGl5X3RoZW1lICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygnI2ZlZTA4YicsICcjOTlkNTk0JywgJyNkNTNlNGYnLCAnIzMyODhiZCcpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9saW5lKHNpemUgPSAuMywgY29sb3IgPSAnZGFya2dyZXknKSwKICAgICAgICBheGlzLnRpY2tzLmxlbmd0aC54ID0gdW5pdCguMDUsJ2NtJyksCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguNSwxKSwKICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gJ2hvcml6b250YWwnLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueT1lbGVtZW50X2xpbmUoc2l6ZSA9IC4yLCBjb2xvciA9ICdncmV5JyksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41LCBzaXplID0gMjUpKSArCiAgbGFicyh0aXRsZSA9ICdEaWZmZXJlbnQgVHlwZXMgb2YgV29tZW4gYW5kIFRoZWlyIFN0dWRlbnQgTG9hblxuJywKICAgICAgIGNhcHRpb24gPSAnXG4gU291cmNlOiBTdXJ2ZXkgb2YgQ29uc3VtZXIgRmluYW5jZXMgKFNDRiknKQoKcHJpbnQod29tZW4pCmBgYAoKCjxwIHN0eWxlPSJmb250LWZhbWlseTogZ2VvcmdpYTsgZm9udC1zaXplOjExcHQ7IGZvbnQtc3R5bGU6cmVndWxhciI+CkluIHRoaXMgc2VjdGlvbiwgSSB3b3VsZCBmb2N1cyB0aGlzIHF1ZXN0aW9uIHRvIGEgbW9yZSBzcGVjaWZpYyBhbmdsZSwgYW5kIHNlZSB0aGUgc3R1ZGVudCBsb2FuIHBhdHRlcm4gdGhyb3VnaCB0aGUgbGVucyBvZiBnZW5kZXIsIGZhbWlseSBhbmQgY2hpbGRyZWFyaW5nLiA8L3A+IAoKPHAgc3R5bGU9ImZvbnQtZmFtaWx5OiBnZW9yZ2lhOyBmb250LXNpemU6MTFwdDsgZm9udC1zdHlsZTpyZWd1bGFyIj4KSW4gdGhlIGZpcnN0IGdyYXBoLCBJIHNob3dlZCB0aGUgZGlmZmVyZW50IHBhdHRlcm4gYmV0d2VlbiBtYWxlIGFuZCBmZW1hbGUsIHNpbmdsZSBvciBtYXJyaWVkLCBoYXZpbmcga2lkcyBvciBub3QuIEl0IGlzIHN1cnByaXNpbmcgdG8gc2VlIGhvdyBzaW5nbGUgbW90aGVyIGhhdmluZyBzdWNoIGEgYnVyZGVuLiA8L3A+IAoKPHAgc3R5bGU9ImZvbnQtZmFtaWx5OiBnZW9yZ2lhOyBmb250LXNpemU6MTFwdDsgZm9udC1zdHlsZTpyZWd1bGFyIj4KRnVydGhlcm1vcmUsIHdoZW4gSSBrZWVwIG9uIGRpZ2dpbmcgaW50byB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc3R1ZGVudCBsb2FuIGFuZCB3b21lbidzIG1hcnJpYWdlIHN0YXR1cyBhbmQgcG9zaXRpb24gaW4gdGhlaXIgbGlmZSBjaXJjbGUsIHdlIGNhbiBzZWUgdGhlIGRpZmZpY3VsdHkgeW91bmcgd29tZW4gKGVzcGVjaWFsbHkgeW91bmcgc2luZ2xlIHdvbWVuKSBoYXZlIGJlZW4gdGhyb3VnaC4gPC9wPiAKCjxwIHN0eWxlPSJmb250LWZhbWlseTogZ2VvcmdpYTsgZm9udC1zaXplOjExcHQ7IGZvbnQtc3R5bGU6cmVndWxhciI+CklmIHRoZXJlIGlzIG9ubHkgb25lIHNsb3QgaW4gdGhlIHJlcG9ydCBhdmFpbGFibGUgdG8gcHV0IHRoZSBncmFwaCBpbiwgSSB3b3VsZCByZWNvbW1lbmQgdGhlIGZpcnN0IGdyYXBoLCBhcyBpdCBnaXZlcyBhIGJpZ2dlciBwaWN0dXJlLCBhbmQgaW52b2x2aW5nIGJvdGggbWFsZSBhbmQgZmVtYWxlLiBCZXNpZGVzLCB0aGUgc2hhcnAgY29tcGFyaXNvbiBjYW4gc3VyZSBiZSAiY2xpY2tiYWl0eSIuPC9wPiAKCgojIyBUYXNrIDMuIFdlYWx0aCBhbmQgSW5jb21lIERpc3RyaWJ1dGlvbgoKCmBgYHtyIHEzLCBpbmNsdWRlPVRSVUUsIGZpZy5yZXRpbmE9MiwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9Nn0KZHRfbndjYXQgPC0gZHRbeWVhciA9PSAyMDE2JmVkbl9pbnN0PjAsXQpkdF9ud2NhdCRud2NhdCA8LSBhcy5mYWN0b3IoZHRfbndjYXQkbndjYXQpCmxldmVscyhkdF9ud2NhdCRud2NhdCkgPC0gYygnbGVhc3QgXG53ZWFsdGh5JywnbGVzcyBcbndlYWx0aHknLCdtZWRpdW0nLCd3ZWFsdGh5JywnbW9zdCBcbndlYWx0aHknKQoKZ2dwbG90KGRhdGEgPSBkdF9ud2NhdCwgIAogICAgICAgYWVzKHggPSAgZWRuX2luc3QvZGVidCwgZmlsbCA9IGFzLmZhY3Rvcihud2NhdCkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAuMDEpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMobndjYXQpLCBzY2FsZXMgPSAnZnJlZV95Jywgc3dpdGNoID0gJ2JvdGgnKSArCiAgZGl5X3RoZW1lKwogIGxhYnModGl0bGUgPSAiVGhlIFByb3BvcnRpb24gb2YgU3R1ZGVudCBMb2FuIGluIFRvdGFsIERlYnQgYW5kIEZhbWlseSBOZXQgV29ydGgiLAogICAgICBjYXB0aW9uID0gJ1xuIFNvdXJjZTogU3VydmV5IG9mIENvbnN1bWVyIEZpbmFuY2VzIChTQ0YpJykrCiAgdGhlbWUoYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgc3RyaXAudGV4dC55PWVsZW1lbnRfdGV4dChzaXplID0gMTgsIGFuZ2xlID0gMTgwLCB2anVzdCA9IDApLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJywKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUsIHNpemUgPSAyNSkpKwogIGFubm90YXRlKCJzZWdtZW50IiwgeD0tSW5mLCB4ZW5kPUluZiwgeT0tSW5mLCB5ZW5kPS1JbmYpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCcjNjZiZDYzJywnI2E2ZDk2YScsJyNmZWUwOGInLCcjZmRhZTYxJywnI2Y0NmQ0MycpKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gYygnMCUgb2YgXG4gdGhlaXIgbG9hbiBpcyBcbiBzdHVkZW50IGxvYW4nLCcnLCdoYWxmIG9mIFxuIHRoZWlyIGxvYW4gaXMgXG4gc3R1ZGVudCBsb2FuJywnJywnMTAwJSBvZiBcbiB0aGVpciBsb2FuIGlzIFxuIHN0dWRlbnQgbG9hbicpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygwLC41LDEpLCBsaW5ldHlwZSA9IDMsIGFscGhhID0gLjMpCgpgYGAKCjxwIHN0eWxlPSJmb250LWZhbWlseTogZ2VvcmdpYTsgZm9udC1zaXplOjExcHQ7IGZvbnQtc3R5bGU6cmVndWxhciI+CkluIHRoaXMgc2VjdGlvbiwgSSB0cnQgdG8gZGVwaWN0IHRoZSBwYXR0ZXJuIGJldHdlZW4gZmFtaWx5IGNhcGl0YWwgYW5kIHRoZWlyIGVkdWNhdGlvbmFsIGRlYnQuIEkgc3Ryb25nbHkgcmVjb21tZW5kIHRoaXMgZ3JhcGgsIGFzIGl0IGp1c3Qgc3BlYWtzIGZvciBpdHNlbGYuIFdlIGNhbiBzZWUgYSBkaXN0aW5jdCBwYXR0ZXJuIGluIHRoZSBzdHJhdGlmaWVkIGhpc3RvZ3JhbS4gTGVzcyB3ZWxsLW9mZiBmYW1pbGllcyBhcmUgbW9yZSBsaWtlbHkgdG8gZGV2b3RlIGFsbCB0aGVpciBtb25leSAoYXQgbGVhc3QgYm9ycm93ZWQgbW9uZXkpIGludG8gZWR1Y2F0aW9uLCB3aGlsZSBhZmZsdWVudCBmYW1pbGllcyB0ZW5kIG5vdCB0byBkbyBzby4gCjwvcD4gCgoKCiMjIFRhc2sgNC4gR29pbmcgYnJva2UKCgpgYGB7ciBxNF9ncmFwaDEsIGluY2x1ZGU9VFJVRSwgZmlnLnJldGluYT0yLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02fQpkdFssIHRocmlmdHkgOj0gZm9vZGhvbWUvKGZvb2Rob21lICsgZm9vZGRlbHYgKyBmb29kYXdheSldCmR0WywgaXNUaHJpZnR5IDo9IGN1dChkdCR0aHJpZnR5LCA1KV0KZHRbLCBvb3BzIDo9IGlmZWxzZShibmtydXBsYXN0NSA9PSAxIHwgZm9yZWNsbGFzdDUgPT0gMSwgMSwgMCldCgpkdF9vb3BzX3llYXIgPC0gZHRbeWVhciAlaW4lIDE5OTg6MjAxNiZoZGVidCA9PSAxLCBtZWFuKGVkbl9pbnN0L2RlYnQpLCAKICAgICAgICAgICAgICAgICAgIGJ5ID0gLih5ZWFyLCBvb3BzKV0KZHRfb29wc195ZWFyJG9vcHMgPC0gZmFjdG9yKGR0X29vcHNfeWVhciRvb3BzKQpsZXZlbHMoZHRfb29wc195ZWFyJG9vcHMpIDwtIGMoJ25vIGZpbmFuY2lhbCBjcmlzaXMnLCAnaGF2ZSBmaW5hbmNpYWwgY3Jpc2lzJykKCmdncGxvdChkdF9vb3BzX3llYXIpICsKICBnZW9tX2xpbmUoYWVzKHggPSB5ZWFyLCB5ID0gVjEsIGNvbG9yID0gYXMuZmFjdG9yKG9vcHMpLCAKICAgICAgICAgICAgICAgIGdyb3VwID0gYXMuZmFjdG9yKHllYXIpLCBzaXplID0gMyksIGFscGhhID0gLjUsIGNvbG9yID0gJyNmZmZmYmYnKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IHllYXIsIHkgPSBWMSwgY29sb3IgPSBhcy5mYWN0b3Iob29wcyksIAogICAgICAgICAgICAgICAgIGdyb3VwID0gYXMuZmFjdG9yKHllYXIpLCBzaXplID0gMykpICsKICBkaXlfdGhlbWUgKwogIGdlb21fbGluZShkYXRhID0gZHRfb29wc195ZWFyLAogICAgICAgICAgICBhZXMoeCA9IHllYXIsIHkgPSBWMSwgY29sb3IgPSBhcy5mYWN0b3Iob29wcykpLAogICAgICAgICAgICBhbHBoYSA9IC41LCBzaXplID0gLjIsCiAgICAgICAgICAgIGxpbmV0eXBlID0gMikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCcjZjQ2ZDQzJywnIzY2YmQ2MycpKSArCiAgbGFicyh0aXRsZSA9ICdQcm9wb3J0aW9uIG9mIFN0dWRlbnQgTG9hbiBpbiBUaGVpciBUb3RhbCBEZWJ0IEFtb3VudCBhbmRcblBlcnNvbmFsIEZpbmFuY2lhbCBDcmlzaXNcbicsCiAgICAgICBjYXB0aW9uID0gJ1xuIFNvdXJjZTogU3VydmV5IG9mIENvbnN1bWVyIEZpbmFuY2VzIChTQ0YpJykgKwogIHNjYWxlX3NpemUoZ3VpZGUgPSBGKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC41LDEpLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICdob3Jpem9udGFsJywKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55PWVsZW1lbnRfbGluZShzaXplID0gLjMsIGNvbG9yID0gJ2dyZXknKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUsIHNpemUgPSAyNSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoInllYXIiLCAKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYXMuY2hhcmFjdGVyKGR0X211bHRpRGVidCR5ZWFyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gZHRfbXVsdGlEZWJ0JHllYXIpIApgYGAKCgpgYGB7ciBxNF9ncmFwaDIsIGluY2x1ZGU9VFJVRSwgZmlnLnJldGluYT0yLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02fQpkdCRvb3BzIDwtIGZhY3RvcihkdCRvb3BzKQpsZXZlbHMoZHQkb29wcykgPC0gYygnbm8gZmluYW5jaWFsIGNyaXNpcycsICdoYXZlIGZpbmFuY2lhbCBjcmlzaXMnKQoKZ2dwbG90KGR0W3llYXIgPT0gMjAxNiZlZG5faW5zdD4wXSwgCiAgICAgICBhZXMoeCA9IHRocmlmdHksIHkgPSBlZG5faW5zdCwgY29sb3IgPSBhcy5mYWN0b3Iob29wcykpKSsKICBnZW9tX2ppdHRlcihhbHBoYSA9IC4yLCBzaXplID0gMykrCiAgc2NhbGVfeV9sb2cxMCgpICsKICBsYWJzKHRpdGxlID0gJ0Ftb3VudCBvZiBTdHVkZW50IExvYW4gYW5kIFBlcnNvbmFsIENvbnN1bXB0aW9uIEJlaGF2aW9yIGluIDIwMTZcbicsCiAgICAgICBjYXB0aW9uID0gJ1xuIFNvdXJjZTogU3VydmV5IG9mIENvbnN1bWVyIEZpbmFuY2VzIChTQ0YpJykgKwogIGRpeV90aGVtZSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC41LDEpLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICdob3Jpem9udGFsJywKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55PWVsZW1lbnRfbGluZShzaXplID0gLjMsIGNvbG9yID0gJ2dyZXknKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUsIHNpemUgPSAyNSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygnI2Y0NmQ0MycsJyM2NmJkNjMnKSkrCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9CiAgICAgICAgICAgICAgICAgICAgICAgYygnbGVhc3RcbnRocmlmdHknLCcnLCdtZWRpdW1cbnRocmlmdHknLCcnLCdleHRyZW1lbHlcbnRocmlmdHknKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoMCwuNSwxKSwgbGluZXR5cGUgPSAzLCBhbHBoYSA9IC4zKSAKCmBgYAoKPHAgc3R5bGU9ImZvbnQtZmFtaWx5OiBnZW9yZ2lhOyBmb250LXNpemU6MTFwdDsgZm9udC1zdHlsZTpyZWd1bGFyIj4KSW4gdGhpcyBzZWN0aW9uLCBJIGNvbXBhcmUgdGhvc2Ugd2hvIG1lc3NlZCB1cCB0aGVpciBvd24gZmluYW5jaWFsIHNpdHVhdGlvbiB3aXRoIHRob3NlIHdobyBkbyBub3QgaW4gdGVybXMgb2YgdGhlaXIgc3R1ZGVudCBsb2FuLiBPdmVyIHRoZSB5ZWFycyAoZGF0YSBiZWZvcmUgMTk5OCBpcyBsZWZ0IG91dCBiZWNhdXNlIG9mIG1pc3NpbmcgZGF0YSksIHBlb3BsZSB3aG8gYXJlIGluIHBlcnNvbmFsIGZpbmFuY2lhbCBjcmlzaXMgdGVuZCB0byBkZXZvdGUgbW9yZSBpbnRvIHRoZWlyIChvciB0aGVpciBjaGlsZHJlbidzKSBlZHVjYXRpb24uIFRoaXMgY2FuIGJlIGEgZ3JlYXQgYXNwZWN0IHRvIHRlbGwgYSBzdG9yeS4gCjwvcD4gCjxwIHN0eWxlPSJmb250LWZhbWlseTogZ2VvcmdpYTsgZm9udC1zaXplOjExcHQ7IGZvbnQtc3R5bGU6cmVndWxhciI+ClRoZSBzZWNvbmQgZ3JhcGggc2hvd3MgaG93IHRocmlmdHkgcmVsYXRlZCB0byBwZW9wbGUncyBzdHVkZW50IGxvYW4gYW1vdW50IGFuZCB0aGVpciBwZXJzb25hbCBmaW5hbmNpYWwgc2l0dWF0aW9uLiBJdCBzZWVtcyB0aGF0IHBlb3BsZSB3aG8gbGVhZCBhIGZydWdhbCBsaWZlIHRlbmQgdG8gaGF2ZSBtb3JlIGFuZCBoaWdoZXIgc3R1ZGVudCBsb2FuLiBUaGlzIHNvdW5kcyBsaWtlIGEgZ3JlYXQgc3RvcnkgdG8gdGFsayBhYm91dCB0aGUgc29jaWFsIHN0cnVjdHVyZS4gCjwvcD4gCjxwIHN0eWxlPSJmb250LWZhbWlseTogZ2VvcmdpYTsgZm9udC1zaXplOjExcHQ7IGZvbnQtc3R5bGU6cmVndWxhciI+CklmIEkgaGF2ZSB0byByZWNvbW1lbmQsIEkgd291bGQgY2hvb3NlIHRoZSBmaXJzdCBvbmUsIGJlY2F1c2Ugb2YgaXRzIG92ZXItdGltZSBwZXJzcGVjdGl2ZSBhbmQgdGhlIHN0cm9uZyBjb21wYXJpc29uIGJldHdlZW4gdGhlc2UgdHdvIHR5cGVzIG9mIHBlb3BsZS4gCjwvcD4gCgogICAgICAgICAgICAKIyMgVGFzayA1LiBNYWtlIHR3byBwbG90cyBpbnRlcmFjdGl2ZQoKCmBgYHtyIHE1X2dyYXBoMSwgZmlnLnJldGluYT0yLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02fQpnZ3Bsb3RseSh3b21lbiwgIHdpZHRoID0gOTAwLCBoZWlnaHQgPSA3MDApCmBgYAoKPHAgc3R5bGU9ImZvbnQtZmFtaWx5OiBnZW9yZ2lhOyBmb250LXNpemU6MTFwdDsgZm9udC1zdHlsZTpyZWd1bGFyIj4KVGhlIHJlYXNvbiB3aHkgSSBjaG9zZSB0byBtYWtlIHRoaXMgb25lIGludGVyYWN0aXZlIGlzIHRoYXQgaXQgY29udGFpbnMgYSBsYXJnZSBhbW91bnQgb2YgaW5mb3JtYXRpb24gYW5kIHBvaW50cyBhcmUgY3Jvd25lZCBpbnRvIHNvbWUgb2YgdGhlc2UgYm94ZXMuIEJ5IGNsaWNraW5nIG9uIGFuZCBvZmYgdGhlc2UgZ3JvdXBzIG9mIHdvbWVuLCByZWFkZXIgY2FuIGNvbXBhcmUgYmV0d2VlbiB0d28gZ3JvdXBzIG9yIHNlZSBwYXR0ZXJuIG9mIG9ubHkgb25lIGdyb3VwIG9mIHdvbWVuLiAKPC9wPiAKCgoKYGBge3IgcTVfZ3JhcGgyLCBmaWcucmV0aW5hPTIsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTZ9CmdncGxvdGx5KGFsbERlYnQyaW5jLCAgd2lkdGggPSA5MDAsIGhlaWdodCA9IDcwMCkKYGBgCgo8cCBzdHlsZT0iZm9udC1mYW1pbHk6IGdlb3JnaWE7IGZvbnQtc2l6ZToxMXB0OyBmb250LXN0eWxlOnJlZ3VsYXIiPgpJIGNob29zZSB0byBpbnRlcmFjdGl2YXRlIHRoaXMgZ3JhcGggYmVjYXVzZSB0aGUgd2hvbGQgdGltZSBsaW5lIGlzIG1lc3NlZCB1cCBieSB0aGUgIm91dGxpZXIiIGluIDE5OTIuIFJlYWRlcnMgdXNpbmcgdGhpcyBpbnRlcmFjdGl2ZSBtYXAgY2FuIGhlbHAgdGhlbXNlbHZlcyB0byBzZWUgbW9yZSBkZXRhaWxlZCBwYXR0ZXJucyBpbiBvdGhlciB5ZWFycywgYnkgem9vbWluZyBpbiBhbmQgb3V0LiAKPC9wPiAKCgojIyBUYXNrIDYuIERhdGEgVGFibGUKCmBgYHtyIHE2fQpkdF9pbnRlciA8LSBkdFt5ZWFyID09IDIwMTYsIGMoJ3llYXInLCAnd29tZW4nLCAndGhyaWZ0eScsICdhZ2VjbCcsICdpbmNvbWUnLCAnZWRuX2luc3QnKV0KZHRfaW50ZXJbLHRocmlmdHk6PXJvdW5kKHRocmlmdHksMyldCmRhdGF0YWJsZShkdF9pbnRlciwgcm93bmFtZXMgPSBGQUxTRSwKICAgICAgICAgIGNvbG5hbWVzID0gYygnWWVhcicsICdUeXBlcyBvZiBXb21lbicsICdUaHJpZnR5IERlZ3JlZScsICdBZ2UnLCAnSW5jb21lJywgJ1N0dWRlbnQgTG9hbicpLAogICAgICAgICAgZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiKSwKICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KGxhbmd1YWdlID0gbGlzdChzU2VhcmNoID0gIkZpbHRlcjoiKSkKICApCmBgYAoKPHAgc3R5bGU9ImZvbnQtZmFtaWx5OiBnZW9yZ2lhOyBmb250LXNpemU6MTFwdDsgZm9udC1zdHlsZTpyZWd1bGFyIj4KSSBjaG9zZSB0byBtYWtlIHRoaXMgdGFibGUgYXMgYW4gaW50ZXJhY3RpdmUgb25lIGlzIGJlY2F1c2UgdGhhdCBvbmUgb2YgdGhlIG1ham9yIHJlYXNvbnMgd2h5IHBlb3BsZSB3YW50IHRvIG1hbmlwdWxhdGUgdGFibGUgdGhlbXNlbHZlcyBpcyB0aGF0IHRoZXkgd2FudCB0byBzZWUgaG93IHBlb3BsZSBzaGFyaW5nIHRoZSBzYW1lIGZlYXR1cmVzIGFzIHRoZW0gbG9vayBsaWtlLiBUaGVyZWZvcmUsIEkgZ2F2ZSB0aGlzIHRhYmxlIHNvIHRoYXQgd29tZW4gY2FuIGNob29zZSBvdmVyIGZlYXR1cmVzIGFuZCBzZWUgdGhlaXIgb3duIHBvc2l0aW9uIGluc2lkZSB0aGVpciBjb3VudGVycGFydHMuIAo8L3A+IAo=